#include <stdio.h>
#include <string.h>

// void function(int a[3])
// void function(int a[ ])
void function(int  *a ) // 最终形式
{

}

int main(int argc, char const *argv[])
{
    // 数组出现在表达式中时，会被系统转化为一个指向其首元素的指针
    // 例外：除了sizeof、取址符之外，数组还是数组，不会被转换

    // 数组下标的本质：a[i] 等价于 *(a+i)

    int a[3] =  { 1, 2, 3 }; 
    //            ↑
    //            a

    *(a+0) = 100;
    a[0] = 100;

    int *k = a;   // p --> a[0]
    k+1; // 跳过4个字节
    // p = a+1;  // p --> a[1]
    printf("%ld\n", sizeof(a)); // 12

    int (*p) [3] =  &a; // p --> a，此处&a代表整个数组（12个字节）的首地址
    p+1; // 跳过12个字节

    function(a);      // 
    function(&a[0]); // 
    //                    b[0]            b[1]             b[2]
    int b[3][5] = {  {1,2,3,4,5}  , {11,22,33,44,55},  {6,7,8,9,10}  };
    printf("%p\n", &b[2][3]);

    printf("%p\n", &b[2][0]);
    printf("%p\n",  b[2]   );

    // 类型一样：int *
    printf("%p\n", &b[0][0]+1); // b[0][0]的地址
    printf("%p\n",  b[0]   +1); // b[0][0]的地址
    printf("%p\n",  *b     +1); // b[0][0]的地址

    // 类型一样：int (*) [5]
    printf("%p\n",  b      +1); // b[0]整个数组的地址
    printf("%p\n", &b[0]   +1); // b[0]整个数组的地址
}
